// 约定 src/app.tsx 为运行时配置

import { createLogger } from 'redux-logger';
import { message } from 'antd';
import undoable, { StateWithHistory } from 'redux-undo';
import { Reducer, AnyAction } from 'redux';
/*
 * redux-logger: 负责打印日志记录，调用的是 getState 函数获取状态值
 * redux-undo: 通过包装reducer，创建一个state History，保留历史state，可以做退一步，进一步操作
 */

// dva的运行时配置
// 配置参数见https://dvajs.com/api/#app-dva-opts
export const dva = {
  config: {
    // onAction: 在 action 被 dispatch 时触发，用于注册 redux 中间件
    // [process.env.NODE_ENV === 'development' ? 'onAction' : '']: createLogger(),
    // onError: 用于管理全局出错状态
    onError(e: Error) {
      message.error(e.message, 3);
    },

    // onReducer: 封装 reducer 执行
    onReducer: (reducer: Reducer<any, AnyAction>) => {
      let undoReducer = undoable(reducer);
      return function (state: StateWithHistory<any>, action: AnyAction) {
        let newState = undoReducer(state, action);
        // 由于 dva 同步了 routing 数据，所以需要把这部分还原
        let router = newState.present.router
          ? newState.present.router
          : newState.present.routing;
        return { ...newState, router: router };
      };
    },
  },
};
